// 导入数据库模块
const db = require("../db/index");
const bcrypt = require("bcryptjs");
// 用这个包来生成 Token 字符串
const jwt = require("jsonwebtoken");
// 导入全局的配置文件
const config = require("../config");
// 抽离

// 注册新用户
exports.regUser = (req, res) => {
  // 获取服务端提交到服务器的信息
  const userinfo = req.body;
  console.log(userinfo);
  // 如果用户名和密码有问题
  if (!userinfo.username || !userinfo.password) {
    res.send({
      status: 1,
      message: "用户名和密码有问题",
    });
  }
  // 测试查询
  // db.query('select * from ev_users', (err, results) => {
  //     if (err) return console.log(err.message);
  //     console.log('结果是', results)
  // })
  // 定义sql语句
  const sqlStr = `select * from ev_users where username=?`;
  db.query(sqlStr, [userinfo.username], (err, results) => {
    // 如果发生错误
    if (err) {
      return res.send({
        status: 1,
        message: "err.message",
      });
    }
    // 用户名被占用
    if (results.length > 0) {
      return res.send({
        status: 1,
        message: "用户名被占用",
      });
    }
    console.log(userinfo);

    // 对用户的密码,进行 bcrype 加密，返回值是加密之后的密码字符串
    userinfo.password = bcrypt.hashSync(userinfo.password, 10);
    // console.log(userinfo);
    // 调用插入的sql语句
    const sql = "insert into ev_users set ?";
    db.query(
      sql,
      {
        username: userinfo.username,
        password: userinfo.password,
      },
      function (err, results) {
        // 执行 SQL 语句失败
        if (err) {
          // return res.send({ status: 1, message: err.message })
          return res.cc(err);
        }
        // SQL 语句执行成功，但影响行数不为 1
        if (results.affectedRows !== 1) {
          return res.cc("注册用户失败，请稍后再试！");
        }
        // 注册成功
        // res.send({ status: 0, message: '注册成功！' })
        // 成功的话也可以用封装的cc函数，修改status为0就行
        res.cc("注册成功！", 0);
      }
    );
    // res.send('ok')
  });
  // res.send('reguser OK3')
};

// 登录
exports.login = (req, res) => {
  // 测试查询
  // db.query('select * from ev_users', (err, results) => {
  //     if (err) return console.log(err.message);
  //     console.log('结果是', results)
  // })
  // 验证登录
  // 接收表单数据
  const userinfo = req.body;
  console.log(req.body);
  const sql = `select * from ev_users where username=?`;
  // 定义sql语句，根据用户名查询用户的信息
  db.query(sql, userinfo.username, (err, results) => {
    // 执行sql语句失败的情况
    if (err) return res.cc(err);
    // 获取数据条数不等于1
    if (results.length !== 1) return res.cc("没有该用户，登录失败");

    // 判断用户密码是否正确,这是比较加密后的
    const compareResult = bcrypt.compareSync(
      userinfo.password,
      results[0].password
    );
    // 加上没有加密的，在数据库上手动增加用户信息的情况，&&userinfo.password!=results[0].password
    if (!compareResult && userinfo.password != results[0].password)
      return res.cc("密码错误，登录失败");  

    // 服务器端生成token字符串,清楚敏感信息
    const user = {
      ...results[0],
      password: "",
      user_pic: "",
    };
    console.log("这个是登录用户的信息", user);

    // 将用户信息对象加密成 Token 字符串：
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: config.expiresIn,
    });
    console.log("这个是", results[0].username, "用户的token:", tokenStr);

    res.send({
      status: 0,
      username: results[0].username,
      token: "Bearer " + tokenStr,
    });
    // res.send('login OK')
  });
};

// 注销
exports.destroy = (req, res) => {
  res.send("destroy ok ");
};
